package main

import (
	"fmt"
	"net/http"
	"github.com/gorilla/sessions"
)

// 定义 session 的密钥（必须保密，用于加密 cookie）
var (
	key   = []byte("super-secret-key")      // 设置密钥（建议设置为更安全的长度和复杂度）
	store = sessions.NewCookieStore(key)    // 创建一个基于 Cookie 的 session 存储
)

// 访问 /secret 会检查用户是否已经登录（session 中是否认证通过）
func secret(w http.ResponseWriter, r *http.Request) {
	// 获取 session，名称为 "cookie-name"
	session, _ := store.Get(r, "cookie-name")

	// 判断是否已认证（authenticated）
	if auth, ok := session.Values["authenticated"].(bool); !ok || !auth {
		http.Error(w, "Forbidden", http.StatusForbidden) // 如果没登录，返回 403
		return
	}

	// 如果已经认证，显示秘密内容
	fmt.Fprintln(w, "The cake is a lie!")
}

// 访问 /login 会模拟登录，将 session 设置为已认证状态
func login(w http.ResponseWriter, r *http.Request) {
	session, _ := store.Get(r, "cookie-name")

	// 这里本应是实际的登录验证（用户名/密码检查），此处略去
	// 假设认证成功，我们设置 session 中 authenticated 为 true
	session.Values["authenticated"] = true
	session.Save(r, w) // 保存 session 到客户端的 cookie 中
}

// 访问 /logout 将清除认证信息（相当于退出登录）
func logout(w http.ResponseWriter, r *http.Request) {
	session, _ := store.Get(r, "cookie-name")

	// 设置 authenticated 为 false，表示退出登录
	session.Values["authenticated"] = false
	session.Save(r, w) // 保存更改
}

// 启动 HTTP 服务器，注册 3 个路由
func main() {
	http.HandleFunc("/secret", secret) // 只有登录后才能访问
	http.HandleFunc("/login", login)   // 登录入口
	http.HandleFunc("/logout", logout) // 登出入口

	http.ListenAndServe(":8080", nil)
}
